/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

void hanoi_jeu(void) {

	int continuer = 1;
	char *contenu_titre = "JEU DES TOURS DE HANOI";

	while(continuer != 2) {
		int  ok = 0, i = 0, j = 0;
		long deplacements = 0, niveau, fin = 2, colonne_depart = 2, colonne_arrivee = 2, case_depart = 0, case_arrivee = 0, taille_depart, taille_arrivee, lignes_colonnes[10][3] = {{0}};

		clear();
		afficher_titre(contenu_titre);
		CSLP_ColorText(CT);
		addstr("\n\nPour augmenter le nombre de cubes, appuyer sur → .\nPour diminuer  le nombre de cubes, appuyer sur ← .\n\nLe le nombre de cubes actuel est :\n");

		niveau = afficher_barre_full(1, 9, 1, 5);

		for(i = 0; i < niveau; i++) {
			lignes_colonnes[i][0] = niveau - i;
		}

		clear();
		afficher_titre(contenu_titre);

		while(fin == 2 && ok != 1) {
			colonne_depart = 2, colonne_arrivee = 2, case_depart = -1, case_arrivee = -1, taille_depart = 0, taille_arrivee = 0;
			deplacements++;
			colonne_depart = hanoi_selection_collonne(lignes_colonnes, deplacements, 1);

			if(colonne_depart != 0) {
				colonne_depart--;
				i = 9;

				while(i != -1 && case_depart == -1) {
					if(lignes_colonnes[i][colonne_depart] != 0) {
						case_depart = i;
						taille_depart = lignes_colonnes[i][colonne_depart];
					}

					i--;
				}

				if(taille_depart != 0) {
					colonne_arrivee = hanoi_selection_collonne(lignes_colonnes, deplacements, 2);

					if(colonne_arrivee != 0) {
						colonne_arrivee--;
						i = 9;

						while(i != -1 && case_arrivee == -1) {
							if(lignes_colonnes[i][colonne_arrivee] != 0) {
								case_arrivee = i;
								taille_arrivee = lignes_colonnes[i][colonne_arrivee];
							}

							i--;
						}

						if(case_arrivee == -1) {
							case_arrivee = -1, taille_arrivee = 0;
						}

						if(taille_depart < taille_arrivee || taille_arrivee == 0) {
							lignes_colonnes[case_depart][colonne_depart] = 0;
							lignes_colonnes[case_arrivee+1][colonne_arrivee] = taille_depart;
						}
						else {
							hanoi_selection_collonne(lignes_colonnes, deplacements, 4);
							deplacements--;
						}
					}
				}
				else {
					hanoi_selection_collonne(lignes_colonnes, deplacements, 3);
					deplacements--;
				}
			}
			else {
				clear();
				fin = afficher_menu("Oui\nNon\n", "Voulez-vous quitter la partie en cours ?\n", contenu_titre);
				clear();
				afficher_titre(contenu_titre);
			}

			i = 9;
			j = 0;

			while(i != -1 && j != 1) {
				if(lignes_colonnes[i][0] != 0) {
					j = 1;
				}

				i--;
			}

			if(j == 0) {
				i = 9;

				while(i != -1 && j != 1) {
					if(lignes_colonnes[i][1] != 0) {
						j = 1;
					}

					i--;
				}

				if(j == 0) {
					ok = 1;
				}
			}
		}

		if(ok == 1) {
			gagner();
		}

		clear();
		continuer = afficher_menu_recommencer(contenu_titre);
		CSLP_ColorText(CT);
	}
}

long hanoi_selection_collonne(long lignes_colonnes[10][3], long deplacements, int type) {
	int l = 0;
	long choix = 2;

	while(l != '\r' && l != '\n' && l != '\b') {
		if(type == 1)
			hanoi_afficher_tours(lignes_colonnes, choix, deplacements, type, "Veuillez dépacer le curseur sous la colonne dont vous voulez déplacer le cube.");
		else if(type == 2)
			hanoi_afficher_tours(lignes_colonnes, choix, deplacements, type, "Veuillez dépacer le curseur sous la colonne où vous voulez placer le cube.");
		else if(type == 3)
			hanoi_afficher_tours(lignes_colonnes, choix, deplacements, type, "Veuillez choisir une collone avec au moins un cube!");
		else if(type == 4)
			hanoi_afficher_tours(lignes_colonnes, choix, deplacements, type, "Veuillez choisir une collone où le cube de dessous est plus grand que celui que vous voulez déplacer!");

		if(type < 3) {
			l = getch();

			if(l == touche_gauche) {
				if(choix > 1) {
					choix--;
				}
			}

			if(l == touche_droite) {
				if(choix < 3) {
					choix++;
				}
			}

			if(l == '0') {
				choix = 0;
			}
		}
		else {
			afficher_temps(39, 'm', 1, 2000);
			l = '\n';
		}

	}

	return choix;
}
